/*
 * Copyright 2023-2024, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Haiku Development Team
 */

#include <arch/real_time_clock.h>
#include <boot/kernel_args.h>

#include <real_time_clock.h>
#include <real_time_data.h>
#include <smp.h>

// 龙芯3A6000使用的RTC寄存器基地址
// 注意：实际地址需要根据龙芯3A6000的硬件规格进行调整
#define LOONGARCH_RTC_BASE 0x1fe00000

// RTC寄存器偏移量
#define RTC_TOY_READ0 0x20  // 时间寄存器0（读）
#define RTC_TOY_READ1 0x24  // 时间寄存器1（读）
#define RTC_TOY_WRITE0 0x28 // 时间寄存器0（写）
#define RTC_TOY_WRITE1 0x2c // 时间寄存器1（写）
#define RTC_TOY_MATCH0 0x30 // 时间匹配寄存器0
#define RTC_TOY_MATCH1 0x34 // 时间匹配寄存器1
#define RTC_TOY_MATCH2 0x38 // 时间匹配寄存器2

// 读取RTC寄存器
static inline uint32
read_rtc_reg(uint32 reg)
{
    return *(volatile uint32 *)(LOONGARCH_RTC_BASE + reg);
}

// 写入RTC寄存器
static inline void
write_rtc_reg(uint32 reg, uint32 val)
{
    *(volatile uint32 *)(LOONGARCH_RTC_BASE + reg) = val;
}

status_t
arch_rtc_init(kernel_args *args, struct real_time_data *data)
{
    // 初始化系统时间转换因子
    // 这个因子用于将硬件计数器的值转换为微秒
    data->arch_data.system_time_conversion_factor = (1LL << 32) * 1000000LL / args->arch_args.timerFrequency;

    dprintf("LoongArch64 RTC: timerFrequency: %" B_PRIu64 ", conversion factor: %" B_PRIu64 "\n",
            args->arch_args.timerFrequency, data->arch_data.system_time_conversion_factor);

    return B_OK;
}